00. 사전 준비 (Docker Desktop · 3노드 K8s · istioctl 환경 구축)

00. 사전 준비: Docker Desktop 설치부터 3노드 Kubernetes · istioctl 구축까지

문서 개요

아무것도 설치되지 않은 새 PC(Windows 11 또는 macOS)를 기준으로, WSL 2 및 Docker Desktop 설치 → Docker Desktop 내장 Kubernetes(3노드 kind 방식) 활성화 → 서비스 메시 제어 도구(istioctl, helm) 설치까지 전 과정을 정리한 환경 구축 레퍼런스입니다.

전체 구축 순서 한눈에 보기

순서 단계 핵심 내용
1 PC 사양 및 터미널 확인 RAM 16GB 이상 권장, Windows는 PowerShell 사용 (Git Bash 비권장)
2 Docker Hub 계정 준비 이미지 다운로드 횟수 제한(Rate Limit) 해제용 무료 계정 생성
3 WSL 2 및 Docker Desktop 설치 리눅스 커널 가상화(WSL 2) 활성화 및 Docker Desktop 설치·로그인
4 Docker Desktop 내장 Kubernetes 켜기 kubeadm이 아닌 kind 방식(노드 3개) 으로 멀티 노드 클러스터 생성
5 istioctl 및 Helm 설치 서비스 메시(Istio) 제어 CLI 및 쿠버네티스 패키지 매니저(LGTM 스택 설치용) 준비
6 최종 상태 점검 docker, kubectl, istioctl, helm 및 3노드 Ready 상태 확인

1. PC 권장 사양 및 터미널 선택

1-1. 하드웨어 권장 사양

본 스터디는 쿠버네티스 노드 3대 + Istio 서비스 메시 + 외부 PostgreSQL VM + LGTM(Loki·Grafana·Tempo·Mimir/VictoriaMetrics) 관측 스택을 로컬에서 직접 띄우므로 아래 사양을 권장합니다.

항목 최소 사양 권장 사양 비고
메모리 (RAM) 8GB (노드 2개로 축소 실행) 16GB ~ 32GB 이상 3노드 K8s + LGTM 스택 동시 구동 시 약 4~6GB 사용
디스크 여유 공간 25GB 50GB 이상 (SSD) 컨테이너 이미지 및 시계열/로그 데이터 저장
운영체제 (OS) Windows 10 22H2 / Windows 11, macOS Windows 11 23H2 이상 (64비트) WSL 2 최신 커널 지원

1-2. 사용할 터미널: Windows는 반드시 PowerShell

OS 사용할 터미널 주의 사항
Windows PowerShell (또는 Windows Terminal 내 PowerShell 탭) Git Bash(MINGW64)는 사용하지 마세요
macOS 기본 터미널(Terminal) 또는 iTerm2 (zsh) -
왜 Windows에서 Git Bash를 쓰면 안 되나요?

Git Bash는 명령어 인자에 /etc/istio/proxy 나 /sys/fs/cgroup 같은 리눅스 경로가 들어가면 이를 C:/Program Files/Git/etc/... 라는 윈도우 경로로 몰래 바꿔치기(Path Mangling) 해서 컨테이너에 전달합니다. 이 때문에 파드 내부 설정 파일을 조회할 때 경로 에러가 발생하므로, 모든 실습은 PowerShell 기준으로 진행합니다.


2. Docker Hub 계정 만들기 (무료)

Docker Hub는 컨테이너 이미지(istio/proxyv2, grafana/alloy, postgres 등)를 내려받는 공식 저장소입니다.

  1. https://hub.docker.com 에 접속해 Sign up으로 무료(Personal) 계정을 만듭니다.
  2. 왜 로그인이 필요한가요?
    • 비로그인 상태에서는 같은 공인 IP 기준 6시간당 100회까지만 이미지를 내려받을 수 있습니다.
    • 서비스 메시와 LGTM 모니터링 스택은 여러 개의 컨테이너 이미지를 한꺼번에 받아오므로, Docker Desktop에 로그인해 두어야 다운로드 한도 초과(429 Too Many Requests: toomanyrequests) 에러를 겪지 않습니다.

3. WSL 2 및 Docker Desktop 설치

용어 정리: 왜 Windows에서 Docker를 쓰려면 WSL 2가 필요한가요?

  • 컨테이너는 원래 리눅스 커널(Linux Kernel) 의 격리 기능(Namespace, cgroups, iptables)을 써서 돌아갑니다. 따라서 윈도우 커널 위에서는 리눅스 컨테이너가 직접 돌 수 없습니다.
  • WSL 2 (Windows Subsystem for Linux 2): 윈도우 안에 아주 가볍고 빠른 진짜 리눅스 커널 가상머신(VM) 을 띄워 주는 마이크로소프트의 공식 기술입니다.
  • Docker Desktop: 이 WSL 2 리눅스 공간 안에 컨테이너 엔진(dockerd, containerd)과 쿠버네티스 클러스터를 자동으로 설치해 주고, 윈도우 PowerShell에서 명령어로 편하게 조작할 수 있게 연결해 주는 통합 프로그램입니다.

3-1. Windows: WSL 2 설치 및 최신화

  1. 시작 메뉴에서 PowerShell을 찾아 우클릭 → 관리자 권한으로 실행을 누릅니다.
  2. 아래 명령어를 순서대로 실행해 WSL 2를 설치하고 최신 커널로 업데이트합니다.
# 1. WSL 기본 기능 활성화 (이미 설치되어 있으면 안내 메시지만 출력됨)
wsl --install --no-distribution

# 2. WSL 커널을 최신 버전으로 업데이트
wsl --update

# 3. 설치된 WSL 버전 확인 (WSL 버전 2.x 이상, 커널 6.6 이상이면 정상)
wsl --version

출력 예시:

WSL 버전: 2.6.3.0
커널 버전: 6.6.87.2-1
WSLg 버전: 1.0.71
...
wsl --install을 생애 처음 실행했다면

가상화 기능을 켜기 위해 PC를 한 번 재부팅한 뒤 아래 3-2 단계로 넘어가세요.


3-2. Docker Desktop 다운로드 및 설치

방법 A. 설치 파일 다운로드 (권장)

  1. https://docs.docker.com/desktop/setup/install/windows-install/ 에 접속해 Docker Desktop for Windows - x86_64 설치 파일을 내려받습니다. (macOS 사용자는 Mac 칩에 맞춰 Apple Silicon 또는 Intel 버전을 받습니다.)
  2. Docker Desktop Installer.exe를 실행합니다.
  3. 설치 옵션 화면에서 Use WSL 2 instead of Hyper-V (recommended) 가 체크된 상태(기본값)로 OK를 눌러 설치합니다.

방법 B. PowerShell에서 winget으로 한 줄 설치 (Windows)

winget install -e --id Docker.DockerDesktop

3-3. Docker Desktop 실행 및 로그인

  1. 설치가 끝나면 시작 메뉴에서 Docker Desktop을 실행합니다.
  2. 약관 동의 화면에서 Accept를 누릅니다.
  3. 창 왼쪽 아래 상태 표시줄에 초록색 점과 함께 Engine running 이 뜨는지 확인합니다.
  4. 우측 상단의 Sign in 버튼을 눌러 2단계에서 만든 Docker Hub 계정으로 로그인합니다.

PowerShell(일반 권한 창)을 열고 엔진이 잘 응답하는지 확인합니다.

docker version

출력 예시: Client와 Server: Docker Desktop이 모두 출력되면 성공입니다.

Client:
 Version:           29.1.3
...
Server: Docker Desktop 4.56.0 (214940)
 Engine:
  Version:          29.1.3

4. Kubernetes 3노드 클러스터 구축 (kind 방식)

이제 컨테이너들을 지휘할 3노드 Kubernetes 클러스터(관리 본부 control-plane 1대 + 일꾼 worker 2대) 를 띄웁니다.

왜 노드가 1대가 아니라 3대(kind 방식)여야 하나요?

  1. 서로 다른 서버(Node) 간 서비스 메시 터널링 검증 (Part 03)
    • 2세대 Ambient Mesh에서는 1번 워커 노드의 ztunnel 과 2번 워커 노드의 ztunnel 이 서로 15008번 포트로 암호화 터널(HBONE)을 맺고 통신합니다. 노드가 1대뿐이면 노드 간 네트워크 경로를 실험할 수 없습니다.
  2. 외부 Linux/PostgreSQL VM 서버와의 하이브리드 연동 (Part 06)
    • kind 방식으로 클러스터를 띄우면 Docker 내부에 kind라는 브릿지 네트워크가 만들어집니다. 여기에 일반 Linux/PostgreSQL 컨테이너를 연결하면 "쿠버네티스 클러스터 ↔ 클러스터 외부의 레거시 VM 서버" 가 통신하는 하이브리드 서비스 메시 환경을 로컬 PC에서 100% 똑같이 구현할 수 있습니다.

클러스터를 만드는 방법은 [방법 A: Docker Desktop UI 내장 kind 기능 사용] 과 [방법 B: kind CLI로 직접 생성] 두 가지가 있으며, 원리는 100% 동일합니다.


4-1. [방법 A] Docker Desktop 내장 Kubernetes 기능으로 3노드 만들기 (UI 방식)

Docker Desktop 최신 버전(4.38 이상)에는 클릭 몇 번으로 멀티 노드 클러스터를 만들어 주는 kind 프로비저너가 내장되어 있습니다. (단, Docker Desktop에 로그인(Sign in) 되어 있어야 kind 옵션을 선택할 수 있습니다.)

  1. Docker Desktop 오른쪽 위 톱니바퀴 아이콘(Settings ⚙️) 을 누릅니다.
  2. 왼쪽 메뉴에서 Kubernetes 탭을 클릭합니다.
  3. Enable Kubernetes 토글을 켭니다.
  4. Cluster provisioning method (클러스터 생성 방식) 에서 기본값인 kubeadm 대신 반드시 kind 를 선택합니다!
    • Number of nodes (노드 개수): 슬라이더를 움직여 3 으로 맞춥니다.
    • Kubernetes version: 최신 버전(기본값)을 그대로 둡니다.
  5. 오른쪽 아래 Apply & restart 버튼을 누르고 1~2분 정도 기다립니다.
  6. 왼쪽 아래에 초록색 점으로 Kubernetes running 이 표시되면 완료입니다!
🚨 트러블슈팅 실측 분석: 왜 내 Docker Desktop에서 Kubernetes가 계속 "Starting..."(시작 중)에서 멈춰 있나요?

만약 Docker Desktop에서 Kubernetes를 켰는데 초록불이 안 들어오고 계속 Starting... (쿠버네티스 시작 중) 상태에서 무한 대기한다면, 원인은 아래 두 가지 중 하나입니다(실제 로컬 VM 로그 C:\Users\Me\AppData\Local\Docker\log\vm\init.log 해부 결과):

  1. 클러스터 방식이 kind가 아니라 구형 kubeadm으로 선택되어 있는 경우
    • 설정 파일(%APPDATA%\Docker\settings-store.json)에서 kubernetesMode가 구형 단일 노드 방식인 kubeadm 으로 되어 있으면, Windows WSL 2 최신 커널(6.6.x, cgroup v2) 부팅 시 VM 내부의 kubelet 프로세스가 아래 에러를 뿜으며 시작 1초 만에 죽어버립니다(exit status 1):
      E1025 05:51:46.931414 490 run.go:72] "command failed" err="failed to run Kubelet: invalid configuration: cgroup [\"kubepods\"] has some missing controllers: cpuset"
      {"component":"kubernetes","level":"info","msg":"cmd kubelet exited: exit status 1"}
      
    • WSL 2의 /sys/fs/cgroup/kubepods 그룹에 cpuset 컨트롤러가 위임되기 전에 kubeadm의 kubelet이 먼저 실행되면서 크래시가 나는 Docker Desktop kubeadm 모드의 고질적인 버그입니다.
    • 정작 kubelet은 이미 죽었는데 Docker Desktop UI는 파드가 뜨기만 5초마다 무한히 기다리느라(checking kubernetes pods are running...) 화면에 영원히 "Starting..." 만 표시됩니다.
  2. 해결 방법 (2가지)
    • 해결책 ① (UI에서 kind로 변경): Docker Desktop Settings ⚙️ → Kubernetes 에서 Reset Kubernetes cluster(또는 Disable 후 Apply)를 한 번 누른 뒤, 방식을 kubeadm이 아닌 kind (노드 3개) 로 바꾸고 Apply & restart를 누릅니다.
    • 해결책 ② (가장 빠르고 확실한 방법 — 아래 4-2의 kind CLI 직접 사용): Docker Desktop 설정에서는 번거로운 내장 Kubernetes(Enable Kubernetes) 체크를 아예 끄고(Disable) Apply 한 뒤, 아래 4-2 단계처럼 쿠버네티스 공식 kind.exe CLI로 3노드 클러스터(kind-mesh-lab)를 직접 띄우면 버그 없이 1분 만에 깨끗한 최신 클러스터(v1.37.0)가 올라옵니다!

4-2. [참고 대안] 독립 kind CLI로 별도 클러스터를 직접 생성하는 방법

Docker Desktop UI의 내장 Kubernetes가 버전 제한이나 Starting... 무한 대기 문제를 일으킬 때, 쿠버네티스 공식 kind 바이너리를 내려받아 명령어로 3노드 클러스터를 띄우는 방법입니다. (Docker Desktop 내장 kind 모드와 100% 똑같은 구조로 동작하며, 원하는 최신 K8s 버전을 즉시 쓸 수 있고 실습 후 초기화도 3초면 끝납니다.)

PowerShell에 아래 명령어를 복사해 실행합니다.

# 1. 내 사용자 폴더 아래 전용 도구 폴더($HOME\bin) 생성 및 Path 환경 변수 등록
New-Item -ItemType Directory -Path "$HOME\bin" -Force | Out-Null
$env:Path += ";$HOME\bin"
$userPath = [Environment]::GetEnvironmentVariable("Path", "User")
if ($userPath -notlike "*$HOME\bin*") {
    [Environment]::SetEnvironmentVariable("Path", "$userPath;$HOME\bin", "User")
}

# 2. kind v0.33.0 (최신 안정 버전) 다운로드
curl.exe -sSLo "$HOME\bin\kind.exe" "https://github.com/kubernetes-sigs/kind/releases/download/v0.33.0/kind-windows-amd64"
kind version

출력 예시:

kind v0.33.0 go1.26.1 windows/amd64

이제 실습 폴더($HOME\mesh-study)를 만들고, 컨트롤 플레인 1대 + 워커 노드 2대(총 3노드) 설계도를 작성해 클러스터를 생성합니다.

mkdir "$HOME\mesh-study" -Force | Out-Null
cd "$HOME\mesh-study"

@"
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
name: mesh-lab
nodes:
  - role: control-plane
  - role: worker
  - role: worker
"@ | Set-Content -Path kind-config.yaml -Encoding utf8

kind create cluster --config kind-config.yaml

출력 예시:

Creating cluster "mesh-lab" ...
 ✓ Ensuring node image (kindest/node:v1.37.0) 🖼
 ✓ Preparing nodes 📦 📦 📦
 ✓ Writing configuration 📜
 ✓ Starting control-plane 🕹️
 ✓ Installing CNI 🔌
 ✓ Installing StorageClass 💾
 ✓ Joining worker nodes 🚜
Set kubectl context to "kind-mesh-lab"
방법 A(docker-desktop)와 방법 B(kind-mesh-lab)의 차이점

두 방법 모두 Docker Desktop 위에서 3개의 노드 컨테이너를 띄웁니다. 유일한 차이는 kubectl config current-context를 쳤을 때 나오는 클러스터 이름(docker-desktop vs kind-mesh-lab)과 노드 이름 접두사(desktop-worker vs mesh-lab-worker)뿐이며, 이후 Part 01 ~ Part 12의 모든 kubectl / istioctl / helm 명령어는 100% 동일하게 작동합니다.


5. istioctl 및 Helm 설치

Docker Desktop을 설치하면 쿠버네티스 기본 명령줄 도구인 kubectl은 이미 자동으로 함께 설치되어 있습니다 (C:\Program Files\Docker\Docker\resources\bin\kubectl.exe).

여기에 서비스 메시(Istio) 전용 제어 도구인 istioctl 과, 후반부 LGTM 모니터링 스택(Grafana Alloy, Loki, Tempo, Mimir/VictoriaMetrics)을 한 방에 설치할 쿠버네티스용 앱스토어 도구인 Helm 두 가지를 추가로 설치합니다.

5-1. istioctl 1.31.3 설치

curl.exe -sSLo "$HOME\bin\istioctl.zip" "https://github.com/istio/istio/releases/download/1.31.3/istioctl-1.31.3-win.zip"
Expand-Archive -Path "$HOME\bin\istioctl.zip" -DestinationPath "$HOME\bin" -Force
Remove-Item "$HOME\bin\istioctl.zip"
istioctl version --remote=false

출력 예시:

client version: 1.31.3

5-2. Helm (쿠버네티스 패키지 매니저) 확인 및 설치

이미 helm이 설치되어 있는지 확인하고, 없다면 winget 또는 바이너리로 설치합니다.

# helm 설치 여부 확인 (버전이 출력되면 이미 설치된 것임)
helm version --short

만약 helm 명령어를 찾을 수 없다고 나오면 아래 명령어로 즉시 설치합니다.

winget install -e --id Helm.Helm

5-3. Terraform (Part 07 IaC 실습용) 확인 및 설치

Part 07에서 하이브리드 서비스 메시 리소스를 코드로 관리(IaC)할 때 사용하는 Terraform도 함께 확인하고, 없다면 $HOME\bin에 바로 내려받아 둡니다.

# terraform 설치 여부 확인 및 미설치 시 $HOME\bin에 자동 설치
if (-not (Get-Command terraform -ErrorAction SilentlyContinue)) {
    curl.exe -sSLo "$HOME\bin\terraform.zip" "https://releases.hashicorp.com/terraform/1.11.0/terraform_1.11.0_windows_amd64.zip"
    Expand-Archive -Path "$HOME\bin\terraform.zip" -DestinationPath "$HOME\bin" -Force
    Remove-Item "$HOME\bin\terraform.zip"
}
terraform version

6. 최종 상태 점검

아래 명령어를 실행해 Docker Desktop 내장 3노드 클러스터(docker-desktop)와 도구들이 모두 준비되었는지 확인합니다.

# 1. 현재 kubectl이 바라보는 클러스터 확인 (docker-desktop)
kubectl config current-context

# 2. 3개의 노드가 모두 Ready 상태인지 확인
kubectl get nodes -o wide

# 3. 실습용 작업 폴더($HOME\mesh-study) 생성
mkdir "$HOME\mesh-study" -Force | Out-Null

출력 예시 (Docker Desktop 내장 3노드 kind 방식 기준):

docker-desktop

NAME                    STATUS   ROLES           AGE   VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE                         KERNEL-VERSION                     CONTAINER-RUNTIME
desktop-control-plane   Ready    control-plane   3m    v1.31.1   172.19.0.2    <none>        Debian GNU/Linux 12 (bookworm)   6.6.87.2-microsoft-standard-WSL2   containerd://1.7.18
desktop-worker          Ready    <none>          3m    v1.31.1   172.19.0.3    <none>        Debian GNU/Linux 12 (bookworm)   6.6.87.2-microsoft-standard-WSL2   containerd://1.7.18
desktop-worker2         Ready    <none>          3m    v1.31.1   172.19.0.4    <none>        Debian GNU/Linux 12 (bookworm)   6.6.87.2-microsoft-standard-WSL2   containerd://1.7.18
왜 docker ps를 쳐도 desktop-control-plane 컨테이너가 안 보이나요?

Docker Desktop은 사용자가 실수로 쿠버네티스 시스템 컨테이너를 지우지 못하도록 기본적으로 목록에서 숨겨 둡니다(Show system containers = false). 만약 docker ps에서도 노드 컨테이너들을 직접 보고 싶다면 Settings ⚙️ → Kubernetes → Show system containers (advanced) 를 켜면 보입니다.


네비게이션

이전 목록 다음
- 목록으로 Part 01 이론 ▶